package com.interpreter;

import com.interpreter.impl.And;
import com.interpreter.impl.Constant;
import com.interpreter.impl.Not;
import com.interpreter.impl.Or;
import com.interpreter.impl.Variable;

/**
 * 为了说明解释器模式的实现办法，这里给出一个最简单的文法和对应的解释器模式的实现，这就是模拟Java语言中对布尔表达式进行操作和求值。
 * 
 * 　　在这个语言中终结符是布尔变量，也就是常量true和false。非终结符表达式包含运算符and，or和not等布尔表达式。这个简单的文法如下：
 * 
 * 　　　　Expression ::= Constant | Variable | Or | And | Not
 * 
 * 　　　　And 　　　　::= Expression 'AND' Expression
 * 
 * 　　　　Or　　　　　::= Expression 'OR' Expression
 * 
 * 　　　　Not　　　　 ::= 'NOT' Expression
 * 
 * 　　　　Variable　　::= 任何标识符
 * 
 * 　　　　Constant ::= 'true' | 'false'
 * 
 * @author Administrator
 *
 */
public class Test {

	public static void main(String[] args) {
		Context ctx = new Context();
		Variable x = new Variable("x");
		Variable y = new Variable("y");
		ctx.assign(x, false);
		ctx.assign(y, true);
		System.out.println("x=" + x.interpret(ctx));
		System.out.println("y=" + y.interpret(ctx));

		Constant c = new Constant(true);
		Expression exp = new Or(new And(c, x), new And(y, new Not(x)));
		System.out.println(exp.toString() + "=" + exp.interpret(ctx));
		
		Constant x1 = new Constant(false);
		Constant y1 = new Constant(true);
		exp = new Or(new And(c, x1), new And(y1, new Not(x1)));
		System.out.println(exp.toString() + "=" + exp.interpret(ctx));
	}

}
